import MyComponent from "./common/MyComponent";
import { GameConst } from "./constant/GameConst";
import Core from "./Core";
import { GuideManager } from "./GuideSystem/GuideManager";
import HeroModel from "./model/HeroModel";
import Model, { ModelType } from "./model/Model";
import { isLastMonth, isYesterday } from "./utils/TimeUtils";

const { ccclass, property, menu } = cc._decorator;

@ccclass
@menu("游戏初始化/App")
export default class App extends MyComponent {
  private node_ui: cc.Node = null;

  constructor() {
    super();
  }

  protected onLoad(): void {
    //开启物理碰撞管理器
    cc.director.getPhysicsManager().enabled = true;
    //锁帧
    cc.game.setFrameRate(59);
    //绘制物理碰撞
    // cc.director.getPhysicsManager().debugDrawFlags =
    //   cc.PhysicsManager.DrawBits.e_aabbBit |
    //   cc.PhysicsManager.DrawBits.e_jointBit |
    //   cc.PhysicsManager.DrawBits.e_shapeBit;
    this.initGame();
  }

  protected onEnable(): void {
    /**
     * 需要全局监测的时间可以放在这里，如：防沉迷强制下线等
     */
  }

  initGame() {
    //加载并更新本地游戏数据（接入登录后，改为按照用户uid获取，用户uid可设计为：用户账号 + uid）
    Model.init();
    //注册窗口管理器
    Core.windowManager.register(this.node_ui);
    //加载音频
    Core.audioManager.loadSounds();
    //设置音量
    Core.audioManager.setSoundVolume(2);
    //启动时间管理器
    //Core.initTimer(this);
    //游戏全局计时器
    this.schedule(this.updateGame, 1);
  }

  updateGame() {
    //在线时长更新
    Model.get(ModelType.HeroModel).todayOnlineTime += 1;
    //判断当前时间与登录时间是不是同一天
    if (isYesterday(Model.get(ModelType.HeroModel).lastLoginTime)) {
      if (isLastMonth(Model.get(ModelType.HeroModel).lastLoginTime)) {
        //月份更新
        this.onMonthChange();
      }
      //日期发生变化，做新的一天该做的事情
      this.onDateChange();
    }
    /**
     * ...其他需要全局监测的逻辑，也可再次集中处理，比如挂机奖励等
     */
  }

  //日期变化
  onDateChange() {
    /**
     * 1，签到表更新
     * 2，每日充值限制重置
     * 3，每日任务重置
     * 4，假排行榜数据重置
     * 5，当日在线时长清零
     * 6，上次登录时间更新
     * ... 其余在线或上线跨日期的逻辑都可以集中在此处理
     */
  }

  //月份发生变化
  onMonthChange() {
    /**
     * 1，月卡到期处理
     * 2，月卡重置
     * 3，月卡购买限制重置
     * 4，月卡购买次数重置
     * 5，月卡购买金额重置
     * ... 其余在线或上线跨月份的逻辑都可以集中在此处理
     * */
  }
}
